package matheus.tp01cg.objetosdedesenho;

import java.util.ArrayList;

import android.graphics.Bitmap;

/**
 * Agrupamento de desenhos. Consiste em uma lista de ObjetoDeDesenho, mas pode
 * ser manipulado como um ObjetoDeDesenho simples, sendo as operacoes aplicadas
 * a todos os ObjetoDeDesenho presentes na lista.
 * 
 * @author matheus
 * 
 */
public final class DesenhoComposto extends ObjetoDeDesenho {

	/**
	 * Lista contendo os objetos de desenho
	 */
	public ArrayList<ObjetoDeDesenho> listaDeDesenhos = new ArrayList<ObjetoDeDesenho>();

	@Override
	public void desenha(Bitmap bitmap) {
		for (int i = 0; i < listaDeDesenhos.size(); i++) {
			listaDeDesenhos.get(i).desenha(bitmap);
		}
	}

	@Override
	public void rotaciona(Coords centro, double angulo) {
		for (int i = 0; i < listaDeDesenhos.size(); i++) {
			listaDeDesenhos.get(i).rotaciona(centro, angulo);
		}
	}

	@Override
	public void translada(int x, int y) {
		for (int i = 0; i < listaDeDesenhos.size(); i++) {
			listaDeDesenhos.get(i).translada(x, y);
		}
	}

	@Override
	public void escala(Coords ref, double x, double y) {
		for (int i = 0; i < listaDeDesenhos.size(); i++) {
			listaDeDesenhos.get(i).escala(ref, x, y);
		}

	}

	@Override
	public int getMinX() {
		int minX = Integer.MAX_VALUE, aux;
		for (int i = 0; i < listaDeDesenhos.size(); i++) {
			aux = listaDeDesenhos.get(i).getMinX();
			if (aux < minX) {
				minX = aux;
			}
		}
		return minX;
	}

	@Override
	public int getMinY() {
		int minY = Integer.MAX_VALUE, aux;
		for (int i = 0; i < listaDeDesenhos.size(); i++) {
			aux = listaDeDesenhos.get(i).getMinY();
			if (aux < minY) {
				minY = aux;
			}
		}
		return minY;
	}

	@Override
	public int getMaxX() {
		int maxX = Integer.MIN_VALUE, aux;
		for (int i = 0; i < listaDeDesenhos.size(); i++) {
			aux = listaDeDesenhos.get(i).getMaxX();
			if (aux > maxX) {
				maxX = aux;
			}
		}
		return maxX;
	}

	@Override
	public int getMaxY() {
		int maxY = Integer.MIN_VALUE, aux;
		for (int i = 0; i < listaDeDesenhos.size(); i++) {
			aux = listaDeDesenhos.get(i).getMaxY();
			if (aux > maxY) {
				maxY = aux;
			}
		}
		return maxY;
	}

	@Override
	public Object clone() throws CloneNotSupportedException {
		DesenhoComposto novoDesenhoComposto = new DesenhoComposto();
		for (int i = 0; i < listaDeDesenhos.size(); i++) {
			novoDesenhoComposto.listaDeDesenhos
					.add((ObjetoDeDesenho) listaDeDesenhos.get(i).clone());
		}
		return (Object) novoDesenhoComposto;
	}

	@Override
	public boolean intercepta(Coords ponto, int raio) {
		for (ObjetoDeDesenho desenho : listaDeDesenhos) {
			if (desenho.intercepta(ponto, raio)) {
				return true;
			}
		}
		return false;
	}

	public ObjetoDeDesenho interceptaQuem(Coords ponto, int raio) {
		for (ObjetoDeDesenho desenho : listaDeDesenhos) {
			if (desenho.intercepta(ponto, raio)) {
				return desenho;
			}
		}
		return null;
	}

	/**
	 * Elimina desenhos nao exibidos
	 */
	public void recicla() {
		ArrayList<ObjetoDeDesenho> novalistaDeDesenhos = new ArrayList<ObjetoDeDesenho>();
		for (ObjetoDeDesenho desenho : listaDeDesenhos) {
			if (desenho instanceof Reta) {
				if (((Reta) desenho).nula) {
					continue;
				}
			}
			novalistaDeDesenhos.add(desenho);
		}
		listaDeDesenhos = novalistaDeDesenhos;
	}
}
